滑动窗口法:
438. Find All Anagrams in a String
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static List<Integer> findAnagrams(String s, String p) {
List<Integer> res = new ArrayList<>();
if (s.length() == 0 || p.length() == 0 || s.length() < p.length()) {
return res;
}
int[] chars = new int[26];
for (int i = 0; i < p.length(); i++) {
chars[p.charAt(i) - 'a']++;
}
int start = 0, end = 0, len = p.length(), diff = len;
while (end<len){
chars[s.charAt(end)-'a']--;
if(chars[s.charAt(end)-'a']>=0){
diff--;
}
end++;
}
if(diff==0) res.add(0);
while(end<s.length()){
if(chars[s.charAt(start)-'a']>=0){
diff++;
}
chars[s.charAt(start)-'a']++;
start++;
chars[s.charAt(end)-'a']--;
if(chars[s.charAt(end)-'a']>=0){
diff--;
}
if(diff==0)
res.add(start);
end++;
}
return res;
}